package guoanmaker.personal.helper.common.util;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.jasypt.util.binary.StrongBinaryEncryptor;
import org.json.JSONObject;

import guoanmaker.personal.business.model.PayInfo;
import redis.clients.jedis.Jedis;

/**
 * 
 * @ClassName: SystemHelper 
 * @Description: 常用工具类,例如字符转换等
 * @author Yvonne_MGL
 * @date 2017年7月11日 下午7:08:32    
 */
public class SystemHelper {

	/**
	 * 
	 * @Description: 获取6位数字验证码
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年7月11日 下午7:09:24    
	 * @return String    @throws 
	 */
	public static String getSixCode() {
		StringBuilder code = new StringBuilder();
		Random random = new Random();
		for (int i = 0; i < 6; i++) {
			code.append(String.valueOf(random.nextInt(10)));
		}

		String smsText = "" + code;
		return smsText;
	}

	/**
	 * 
	 * @Description: 获取5分钟之后的时间 
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年7月11日 下午7:09:49    
	 * @return Date    @throws 
	 */
	public static Date getMoreFiveMinTime() {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.MINUTE, c.get(Calendar.MINUTE) + 5);
		Date date = c.getTime();
		return date;
	}

	/**
	 * 
	 * @Description: 随机生成用户昵称,规则是gack_as123
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年7月11日 下午7:10:04    
	 * @return String    @throws 
	 */
	public static String getNickName() {
		String chars = "abcdefghijklmnopqrstuvwxyz";
		String num = "1234567890";
		String nikename = "gack_";
		for (int i = 0; i < 2; i++) {
			nikename += chars.charAt((int) (Math.random() * 26));
		}
		for (int i = 0; i < 3; i++) {
			nikename += num.charAt((int) (Math.random() * 10));
		}
		return nikename;
	}
	
	/**
	 * 
	* @Description: 生成随机4位字母 
	* @param @return
	* @author Yvonne_MGL 
	* @date 2018年5月28日 上午9:36:07     
	* @return String    
	* @throws 
	 */
	public static String getCoffeeCode(){
		String chars = "abcdefghijklmnopqrstuvwxyz";
		String code="";
		for (int i = 0; i < 4; i++) {
			code += chars.charAt((int) (Math.random() * 26));
		}
		return code;
	}

	/**
	 * 
	 * @Description: 判断当前时间是否在两个时间之间 
	 * @param timeBegin起始时间
	 * @param timeEnd结束时间
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年7月12日 下午2:45:53    
	 * @return boolean    @throws 
	 */
	public static boolean isBetween(Date timeBegin, Date timeEnd) {
		Date now = new Date();
		if (now.getTime() >= timeBegin.getTime() && now.getTime() <= timeEnd.getTime()) {
			return true;
		}
		return false;
	}

	/**
	 * 
	 * @Description: remove掉session里以指定用户名开头的信息 
	 * @param username
	 *            用户名
	 * @author Yvonne_MGL
	 * @date 2017年7月29日 下午5:14:43    
	 * @return void    @throws 
	 */
	public static void removeSessionByUsername(HttpServletRequest request, String username) {
		Enumeration enumeration = request.getSession().getAttributeNames();
		while (enumeration.hasMoreElements()) {
			String AddFileName = enumeration.nextElement().toString();
			if (AddFileName.startsWith(username)) {
				request.getSession().removeAttribute(AddFileName);
			}
		}
	}

	/**
	 * 
	 * @Description: remove掉session里以指定sessionid结尾的信息 
	 * @param sessionid
	 * @author Yvonne_MGL
	 * @date 2017年7月29日 下午5:16:05    
	 * @return void    @throws 
	 */
	public static void removeSessionBySessionid(HttpServletRequest request, String sessionid) {
		Enumeration enumeration = request.getSession().getAttributeNames();
		while (enumeration.hasMoreElements()) {
			String AddFileName = enumeration.nextElement().toString();
			if (AddFileName.endsWith(sessionid)) {
				request.getSession().removeAttribute(AddFileName);
			}
		}
	}

	/**
	 * 
	 * @Description: 删除redis上username登陆下的sessionid为key的缓存信息
	 * @param username
	 *            用户名
	 * @author Yvonne_MGL
	 * @date 2017年9月14日 下午3:42:30    
	 * @return void    @throws 
	 */
	public static void removeRedis(String username) {
		Jedis jedis = new Jedis("123.56.48.63", 6379);
		jedis.auth("218007");
		String value = jedis.get(username);
		if (value != null) {
			String keys[] = value.split(",");
			if (keys.length > 0) {
				for (int i = 0; i < keys.length; i++) {
					String key = keys[i];
					if (key != null && !key.equals("")) {
						jedis.del(key);
					}
				}
			}
		}
		jedis.del(username);
		jedis.disconnect();
	}

	/**
	 * 
	 * @Description: 调用财务支付平台
	 * @param url接口地址
	 * @param param参数拼接
	 * @author Yvonne_MGL
	 * @date 2017年7月30日 下午5:16:05    
	 * @return void    @throws 
	 */
	public static String httpGetHelper(String url, String param) {
		String result = "";// 访问返回结果
		BufferedReader read = null;// 读取访问结果

		try {
			// 创建url
			URL realurl = new URL(url + "?" + param);
			// 打开连接
			URLConnection connection = realurl.openConnection();
			// 设置通用的请求属性
			connection.setRequestProperty("accept", "*/*");
			connection.setRequestProperty("connection", "Keep-Alive");
			connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 建立连接
			connection.connect();
			// 获取所有响应头字段
			Map<String, List<String>> map = connection.getHeaderFields();
			// 遍历所有的响应头字段，获取到cookies等
			for (String key : map.keySet()) {
				System.out.println(key + "--->" + map.get(key));
			}
			// 定义 BufferedReader输入流来读取URL的响应
			read = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
			String line;// 循环读取
			while ((line = read.readLine()) != null) {
				result += line;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (read != null) {// 关闭流
				try {
					read.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}
	
	public static net.sf.json.JSONObject postUrl(String getURL,String param) throws IOException {    
	      // Post请求的url，与get不同的是不需要带参数    
	      URL postUrl = new URL(getURL);    
	      // 打开连接    
	      HttpURLConnection connection = (HttpURLConnection) postUrl    
	              .openConnection();      
	      // 设置是否向connection输出，因为这个是post请求，参数要放在    
	      // http正文内，因此需要设为true    
	      connection.setDoOutput(true);    
	      // Read from the connection. Default is true.    
	      connection.setDoInput(true);    
	      // Set the post method. Default is GET    
	      connection.setRequestMethod("POST");    
	      // Post cannot use caches    
	      // Post 请求不能使用缓存    
	      connection.setUseCaches(false);    
	         
	      connection.setInstanceFollowRedirects(true);    
	      // Set the content type to urlencoded,    
	      // because we will write    
	      // some URL-encoded content to the    
	      // connection. Settings above must be set before connect!    
	      // 配置本次连接的Content-type，配置为application/x-www-form-urlencoded的    
	      // 意思是正文是urlencoded编码过的form参数，下面我们可以看到我们对正文内容使用URLEncoder.encode    
	      // 进行编码    
	      connection.setRequestProperty("Content-Type",    
	              "application/x-www-form-urlencoded");    
	      // 连接，从postUrl.openConnection()至此的配置必须要在connect之前完成，    
	      // 要注意的是connection.getOutputStream会隐含的进行connect。    
	      connection.connect();    
	      DataOutputStream out = new DataOutputStream(connection    
	              .getOutputStream());    
	      out.writeBytes(param);   
	      BufferedReader reader = new BufferedReader(new InputStreamReader(    
	              connection.getInputStream()));    
	      String lines=reader.readLine();   
	      net.sf.json.JSONObject js=net.sf.json.JSONObject.fromObject(lines);  
	      reader.close();    
	      connection.disconnect();  
	      return js;  
	  }    

	/**
	 * 
	 * @Description: 返回值结果 
	 * @param json
	 *            接口返回值
	 * @param @return
	 * @param @throws
	 *            Exception
	 * @author Yvonne_MGL
	 * @date 2017年7月30日 下午5:30:54    
	 * @return PayInfo    @throws 
	 */
	public static PayInfo getPayInfo(String json, String channel) throws Exception {
		PayInfo payInfo = new PayInfo();
		JSONObject dataJson = new JSONObject(json);
		String status = dataJson.getString("status");
		if (status != null && status.equals("SUCCESS")) {
			payInfo.setStatus(status);
			payInfo.setId(dataJson.getString("id"));
			if (channel != null && channel.equals("wx_pub_qr")) {
				JSONObject wx = dataJson.getJSONObject("credential");
				if (wx != null) {
					payInfo.setWx_pub_qr(wx.getString("wx_pub_qr"));
				}
			} else if (channel != null && channel.equals("alipay_pc_direct")) {
				payInfo.setAlipay_code(dataJson.getString("alipay_code"));
			} else if (channel != null && channel.equals("kq")) {
				payInfo.setKq_code(dataJson.getString("kq_code"));
			}
		}
		return payInfo;
	}

	/**
	 * 
	 * @Description: 计算两个字符串时间之间的天数差 
	 * @param smdate
	 *            起始时间
	 * @param bdate
	 *            结束时间
	 * @param @return
	 * @param @throws
	 *            ParseException
	 * @author Yvonne_MGL
	 * @date 2017年8月23日 下午5:22:44    
	 * @return int    @throws 
	 */
	public static int daysBetween(String smdate, String bdate) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.setTime(sdf.parse(smdate));
		long time1 = cal.getTimeInMillis();
		cal.setTime(sdf.parse(bdate));
		long time2 = cal.getTimeInMillis();
		long between_days = (time2 - time1) / (1000 * 3600 * 24);

		return Integer.parseInt(String.valueOf(between_days)) + 1;
	}
	
	/**
	 * 
	* @Description:  判断时间是否在时间段内
	* @param  nowTime需要判断的时间
	* @param  beginTime起始时间
	* @param  endTime结束时间
	* @param @return
	* @author Yvonne_MGL 
	* @date 2018年6月5日 上午11:52:59     
	* @return boolean    
	* @throws 
	 */
	public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
		Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(beginTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
	}

	/**
	 * 
	 * @Description: 或许一周前的时间 
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年8月24日 下午3:39:54    
	 * @return Date    @throws 
	 */
	public static Date getLess7Days() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) - 24 * 7);
		return calendar.getTime();
	}

	/**
	 * 
	 * @Description: 获取2小时前的时间 
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年8月25日 下午2:36:50    
	 * @return Date    @throws 
	 */
	public static Date getLessTwoHourTime() {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.MINUTE, c.get(Calendar.MINUTE) - 120);
		Date date = c.getTime();
		return date;
	}

	/**
	 * 
	 * @Description: 获取days天以后的日期 
	 * @param @param
	 *            days
	 * @param @return
	 * @author Yvonne_MGL
	 * @date 2017年9月11日 下午7:28:23    
	 * @return Date    @throws 
	 */
	public static Date getAfterTime(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + days);
		return calendar.getTime();
	}

	/**
	 * 
	* @Description: 获取用户真实IP 
	* @param @param request
	* @param @return
	* @author Yvonne_MGL 
	* @date 2017年10月13日 下午2:17:06     
	* @return String    
	* @throws 
	 */
	public static String getIp2(HttpServletRequest request) {
		String ip = request.getHeader("X-Forwarded-For");
		if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
			// 多次反向代理后会有多个ip值，第一个ip才是真实ip
			int index = ip.indexOf(",");
			if (index != -1) {
				return ip.substring(0, index);
			} else {
				return ip;
			}
		}
		ip = request.getHeader("X-Real-IP");
		if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
			return ip;
		}
		return request.getRemoteAddr();
	}
	
	/**
	 * 
	* @Description: 查询某个时间10分钟前的时间 
	* @param @return
	* @param @throws Exception
	* @author Yvonne_MGL 
	* @date 2017年8月8日 下午6:39:54     
	* @return Date    
	* @throws 
	 */
	public static String getLess15Min(){
		Calendar calendar = Calendar.getInstance();
	    calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - 15);
	    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	    return sdf.format(calendar.getTime());
	}
}
